home *** CD-ROM | disk | FTP | other *** search
/ Internet Info 1994 March / Internet Info CD-ROM (Walnut Creek) (March 1994).iso / networking / mail / mh / contrib / jpeek / fixsubj < prev    next >
Text File  |  1992-08-08  |  5KB  |  169 lines

  1. #! /bin/sh
  2. # $Header: /home/jerry/.bin/RCS/fixsubj,v 1.11 92/08/09 23:26:29 jerry mh_contrib $
  3. #
  4. ###    fixsubj - fix (add or change) "Subject:" on a mail message
  5. ###    Usage: fixsubj [+folder] [msgnum [msgnums]] -s 'new subj'
  6. ##
  7. ##    SOME PEOPLE DON'T BOTHER TO PUT A Subject: LINE ON THEIR MAIL
  8. ##    MESSAGES.  THAT MAKES IT HARD, LATER, WHEN YOU scan YOUR MAIL.
  9. ##    fixsubj LETS YOU ADD YOUR OWN Subject: LINE TO MESSAGE(S).
  10. ##    YOU CAN USE THE SAME SUBJECT ON MANY MESSAGES BY GIVING ALL NUMBERS.
  11. ##
  12. ##    IF A MESSAGE ALREADY HAS A SUBJECT, fixsubj WILL TELL YOU
  13. ##    AND ASK YOU IF YOU WANT TO EDIT IT BY HAND, USE THE DEFAULT
  14. ##    FROM -s), OR SKIP IT.
  15. ##
  16. ##    TO USE IT, TYPE:
  17. ##        % fixsubj -s 'this is the subject'    (FOR THE CURRENT MESSAGE)
  18. ##    OR SOMETHING LIKE
  19. ##        % fixsubj +foo last -s 'a subject'    (last MESSAGE IN foo FOLDER)
  20. ##        % fixsubj -s 'my day' 23-25 42    (MESSAGES 23, 24, 25, AND 42)
  21. ##    ...AND SO ON.  THE SUBJECT, AFTER THE -s, SHOULD BE "ONE WORD" TO
  22. ##    THE SHELL... YOU'LL USUALLY NEED TO QUOTE IT.  YOU CAN PUT THE
  23. ##    OPTIONAL FOLDER NAME (STARTS WITH A +) AND MESSAGE NUMBERS (NUMBERS,
  24. ##    WORDS LIKE last, first:20, first-33, etc.) IN ANY ORDER.
  25. #
  26. #    NOTE TO HACKERS: TABSTOPS ARE SET AT 4 IN THIS CODE
  27. #
  28. #    USE AT YOUR OWN RISK.  SEEMS TO WORK, BUT IT'S YOUR RESPONSIBILITY!
  29. #    PLEASE TELL ME ABOUT BUGS AND FIXES: Jerry Peek, jerry@ora.com
  30.  
  31. editor=${VISUAL-${EDITOR-/usr/ucb/vi}}   # TEXT EDITOR
  32. line="/usr/ucb/head -1"        # READS ONE LINE (USE /bin/line IF YOU HAVE IT)
  33. mh=/usr/local/mh            # WHERE MH COMMANDS LIVE
  34. myname="`basename $0`"        # BASENAME OF THIS PROGRAM
  35. scanopts="-noclear -noheader -noreverse" # BYPASS MH PROFILE
  36. stat=1    # DEFAULT EXIT STATUS; SET TO 0 BEFORE NORMAL EXIT
  37. temp=/tmp/FIXSUBJ$$
  38. temperr=/tmp/FIXSUBJe$$        # HOLDS ERRORS FROM while LOOP
  39. usage="Usage: $myname [+folder] [msgnum] -s 'subject'"
  40.  
  41. trap 'rm -f $temp $temperr; exit $stat' 0 1 2 15
  42. > $temp
  43. > $temperr
  44. chmod 600 $temp $temperr
  45.  
  46. # PARSE COMMAND LINE:
  47. while :
  48. do
  49.     case "$1" in
  50.     "")    break ;;    # NO MORE ARGUMENTS
  51.     -help) echo "$usage" 1>&2; stat=0; exit ;;
  52.     [@+]*) folder="$1"; shift ;;
  53.     -s*)
  54.         case "$2" in
  55.         "")    echo "$usage
  56.             (Missing subject.)" 1>&2
  57.             exit
  58.             ;;
  59.         *)    newsubj="$2"
  60.             shift; shift
  61.             ;;
  62.         esac
  63.         ;;
  64.     *)    msgs="$msgs $1"; shift ;;
  65.     esac
  66. done
  67.  
  68. case "$newsubj" in
  69. "")    echo "$usage
  70.     (Missing subject.)" 1>&2
  71.     exit
  72.     ;;
  73. esac
  74.  
  75. # FOLDER PATH; IF NO $folder GIVEN, DEFAULTS TO CURRENT:
  76. folpath="`$mh/mhpath $folder`" || exit
  77.  
  78. # MAKE LIST OF MESSAGE NUMBERS AND SUBJECTS, ONE PER LINE.
  79. # IF NO Subject: IN MESSAGE, $subjnow WILL BE EMPTY.
  80. # FEED INTO LOOP.  IF NO msgs ON COMMAND LINE, SET TO cur.
  81. #
  82. # sh WILL RUN THIS IN A SUB-SHELL, SO exit WILL ONLY END
  83. # THE LOOP, NOT THE WHOLE SCRIPT.  WORK-AROUND: PUT INTERNAL
  84. # ERRORS ON FILE DESCRIPTOR 3 AND COLLECT AT END OF LOOP:
  85. $mh/scan $scanopts -width 200 -format "%(msg) %{subject}" ${msgs=cur} |
  86. while read msg subjnow
  87. do
  88.     msgpath=$folpath/$msg
  89.  
  90.     # IF MESSAGE IS UNREADABLE, scan (MH6.6 AND BEFORE)
  91.     # WILL PRINT A LINE (TO STANDARD OUTPUT!) LIKE THIS,
  92.     # WITH LEADING BLANKS UNLESS msgnum > 999:
  93.     #   <msgnum>  unreadable
  94.     # IF THERE ARE LEADING BLANKS, SOME BOURNE SHELLS WILL
  95.     # COPY BOTH THE MESSAGE NUMBER AND THE unreadable INTO
  96.     # subjnow, AND LEAVE $msg EMPTY.  TRY TO FIX BOTH CASES:
  97.     case "$msg" in
  98.     "")    echo "$myname: quitting, message $msg $subjnow" 1>&3; break ;;
  99.     esac
  100.     case "$subjnow" in
  101.     unreadable)
  102.         echo "$myname: quitting: can't read message '$msg'." 1>&3
  103.         break
  104.         ;;
  105.     "")    # GLUE Subject AND X-Original-Subject TO TOP.
  106.         # IF YOUR SHELL DOESN'T UNDERSTAND "<<-", REPLACE IT
  107.         # WITH "<<" AND SHIFT LINES TO LEFT-HAND EDGE:
  108.         cat - $msgpath > $temp <<- ENDOFHDR
  109.         Subject: $newsubj
  110.         X-Original-Subject: (none)
  111.         ENDOFHDR
  112.         cp $temp $msgpath || {
  113.             echo "$myname: quitting: can't replace ${msgpath}?" 1>&3
  114.             break
  115.         }
  116.         ;;
  117.     *)    # MESSAGE HAS A SUBJECT ALREADY; ASK USER:
  118.         # LOOP UNTIL GET ANSWER:
  119.         while :
  120.         do
  121.             # SAME NOTE AS ABOVE ABOUT REPLACING "<<-"...
  122.             cat <<- ENDOFMSG
  123.  
  124.             Message $msg already has a subject:
  125.             ... $subjnow
  126.             Type c to change subject to '$newsubj'
  127.             Type e to edit the message yourself with $editor
  128.             Type s to skip this message and go on to the next (if any)
  129.             Type q to quit and not change any more messages.
  130.             ENDOFMSG
  131.             echo -n "And the answer is? " 1>&2
  132.             ans="`$line </dev/tty`"
  133.             case "$ans" in
  134.             s*)    break ;; # CONTINUE OUTER (MESSAGE) LOOP
  135.             q*)    break 2 ;;
  136.             e*)    $editor $msgpath </dev/tty
  137.                 break
  138.                 ;;
  139.             c*) # NOTE: FIX "<<-" AND LINES IF SHELL NEEDS:
  140.                 ed - $msgpath <<- !ENDOFEDIT! >$temp 2>&1
  141.                 /^Subject: /s/^/X-Original-/
  142.                 i
  143.                 Subject: $newsubj
  144.                 .
  145.                 w
  146.                 q
  147.                 !ENDOFEDIT!
  148.                 if [ ! -s $temp ]
  149.                 then break
  150.                 else
  151.                     echo "$myname: error editing '$msg':" 1>&2
  152.                     cat "$temp" 1>&2
  153.                     echo "Should you edit it by hand?  Try again:
  154.                     " 1>&2
  155.                 fi
  156.                 ;;
  157.             *)    echo "Please try again..." 1>&2 ;;
  158.             esac    # END OF case "$ans"
  159.         done        # END OF while :
  160.         ;;
  161.     esac            # END OF case "$subjnow"
  162. done 3> $temperr    # END OF while read msg subjnow
  163.  
  164. if test -s $temperr
  165. then cat $temperr 1>&2
  166. else stat=0
  167. fi
  168. exit
  169.